﻿//判断是不是平衡二叉树
//https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=13&tqId=11192&ru=/exam/oj
//#include <iostream>
//using namespace std;
//
//struct TreeNode {
//	int val;
//	struct TreeNode* left;
//	struct TreeNode* right;
//	TreeNode(int x) : val(x), left(nullptr), right(nullptr) 
//	{}
//};
//
//class Solution 
//{
//public:
//
//	bool IsBalanced_Solution(TreeNode* pRoot) 
//	{
//		return dfs(pRoot) != -1;
//	}
//
//	bool dfs(TreeNode* root)
//	{
//		if (root == nullptr)
//		{
//			return 0;
//		}
//
//		int left = dfs(root->left);
//		if (left == -1) return -1;
//
//		int right = dfs(root->right);
//		if (right == -1) return -1;
//
//		return abs(left - right) <= 1 ? max(left, right) + 1 : -1;
//	}
//};
//
//int main()
//{
//
//
//	return 0;
//}


//逆波兰表达式求值
//https://leetcode.cn/problems/evaluate-reverse-polish-notation/
//#include <iostream>
//#include <vector>
//#include <stack>
//#include <map>
//#include <functional>
//#include <string>
//
//using namespace std;
//
//class Solution 
//{
//public:
//    int evalRPN(vector<string>& tokens) 
//    {
//        stack<int> st;
//        map<string, function<int(int, int)>> funmap =
//        {
//            {"+", [](int x, int y) {return x + y; }},
//            {"-", [](int x, int y) {return x - y; }},
//            {"*", [](int x, int y) {return x * y; }},
//            {"/", [](int x, int y) {return x / y; }},
//        };
//
//        int ret = 0;
//        for (auto& e : tokens)
//        {
//            if (funmap.count(e))
//            {
//                int right = st.top();
//                st.pop();
//                int left = st.top();
//                st.pop();
//
//                ret = funmap[e](left, right);
//                st.push(ret);
//            }
//            else
//            {
//                st.push(stoi(e));
//            }
//        }
//
//        return st.top();
//    }
//};


// 枚举子集（递归实现指数型枚举）
//https://www.luogu.com.cn/problem/B3622
//#include <iostream>
//
//using namespace std;
//
//string s;
//int n;
//
//void dfs(int path)
//{
//	if (path > n)
//	{
//		cout << s << endl;
//		return;
//	}
//
//	//不选
//	s += 'N';
//	dfs(path + 1);
//	s.pop_back();
//	//选
//	s += 'Y';
//	dfs(path + 1);
//	s.pop_back();
//}
//
//int main()
//{
//	cin >> n;
//	dfs(1);
//
//	return 0;
//}

//组合型枚举
// https://www.luogu.com.cn/problem/P10448

//#include <iostream>
//#include <vector>
//using namespace std;
//
//vector<int> path;
//int n, m;
//
//void dfs(int pos)
//{
//	if (path.size() == m)
//	{
//		for (int& e : path)
//		{
//			cout << e << " ";
//		}
//		cout << endl;
//		return;
//	}
//
//	for (int i = pos; i <= n; i++)
//	{
//		path.push_back(i);
//		dfs(i + 1);
//		path.pop_back();
//	}
//}
//
//int main()
//{
//	cin >> n >> m;
//	dfs(1);
//
//	return 0;
//}





//枚举排列（递归实现排列型枚举）
//https://www.luogu.com.cn/problem/B3623
//#include <iostream>
//#include <vector>
//
//using namespace std;
//
//const int N = 15;
//
//int n, m;
//vector<int> path;
//bool st[N];
//
//void dfs()
//{
//	if (path.size() == m)
//	{
//		for (auto& e : path)
//		{
//			cout << e << " ";
//		}
//		cout << endl;
//		return;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		if (st[i]) continue;
//		path.push_back(i);
//		st[i] = true;
//		dfs();
//		path.pop_back();
//		st[i] = false;
//	}
//
//}
//
//int main()
//{
//	cin >> n >> m;
//	dfs();
//
//	return 0;
//}


//#include <iostream>
//#include <vector>
//using namespace std;
//const int N = 15;
//int n, k;
//vector<int> path;
//bool st[N]; // 标记⼀下哪些数已经选过了 
//void dfs()
//{
// if (path.size() == k)
//	{
//		for (auto x : path) cout << x << " ";
//		cout << endl;
//		return;
//	}
//	for (int i = 1; i <= n; i++)
//	{
//		if (st[i]) continue;
//		path.push_back(i);
//		st[i] = true;
//		dfs();
//		// 恢复现场 
//		path.pop_back();
//		st[i] = false;
//	}
//}
//int main()
//{
//	cin >> n >> k;
//	dfs();
//	return 0;
//}

//全排列问题
//https://www.luogu.com.cn/problem/P1706
//#include <iostream>
//#include <vector>
//
//using namespace std;
//
//vector<int> path;
//bool st[15];
//int n;
//
//void dfs()
//{
//	if (path.size() == n)
//	{
//		for (auto& e : path)
//		{
//			cout << e << " ";
//		}
//		cout << endl;
//	}
//		
//	for (int i = 1; i <= n; i++)
//	{
//		if (st[i]) continue;
//		path.push_back(i);
//		st[i] = true;
//		dfs();
//
//		path.pop_back();
//		st[i] = false;
//	}
//}
//
//int main()
//{
//	cin >> n;
//	dfs();
//
//	return 0;
//}


//[NOIP 2002 普及组] 选数
//https://www.luogu.com.cn/problem/P1036
//#include <iostream>
//#include <vector>
//#include <math.h>
//
//using namespace std;
//
//int n, m;
//int sum, ret;
//
//int a[25];
//
//bool is_num(int x)
//{
//	if (x <= 1)
//		return false;
//
//	for (int i = 2; i < sqrt(x); i++)
//	{
//		if (x % i == 0)
//			return false;
//	}
//
//	return true;
//}
//
//void dfs(int pos, int begin)
//{
//	if (pos > m)
//	{
//		if (is_num(sum))
//			ret++;
//		return;
//	}
//
//	for (int i = begin; i <= n; i++)
//	{
//		sum += a[i];
//		dfs(pos + 1, i + 1);
//		sum -= a[i];
//	}
//}
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i];
//	}
//
//	dfs(1, 1);
//
//	cout << ret << endl;
//
//	//cout << is_num(11) << endl;
//
//	return 0;
//}

//#include <iostream>
//#include <cstring>
//
//using namespace std;
//
//const int N = 15;
//int n;
//int t[N], d[N], l[N];
//bool st[N];
//
//bool dfs(int pos, int end)
//{
//	if (pos > n)
//	{
//		return true;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		if (st[i])
//			continue;
//		if (end > t[i] + d[i])
//			continue;
//		int newend = max(end, t[i]) + l[i];
//		st[i] = true;
//		if (dfs(pos + 1, newend)) return true;
//		st[i] = false;
//	}
//	return false;
//}
//
//int main()
//{
//	int T; cin >> T;
//	while (T--) // 多组测试数据的时候，⼀定要注意清空数据 
//	{
//		memset(st, 0, sizeof st);
//		cin >> n;
//		for (int i = 1; i <= n; i++) cin >> t[i] >> d[i] >> l[i];
//		if (dfs(1, 0)) cout << "YES" << endl;
//		else cout << "NO" << endl;
//	}
//	return 0;
//}


#include <iostream>
using namespace std;

const int N = 10;
int n = 9;
int a[N][N];
bool row[N][N], col[N][N], st[N][N][N];

bool dfs(int i, int j)
{
	if (j == n)
	{
		// 当这⼀⾏填满之后 
		i++;
		j = 0;
	}
	if (i == n) return true; // 找到⼀种合法的情况，就停⽌递归 
	if (a[i][j]) return dfs(i, j + 1);
	for (int x = 1; x <= 9; x++)
	{
		if (row[i][x] || col[j][x] || st[i / 3][j / 3][x]) continue; // 剪枝 
		row[i][x] = col[j][x] = st[i / 3][j / 3][x] = true;
		a[i][j] = x;
		if (dfs(i, j + 1)) return true;
		// 恢复现场 
		row[i][x] = col[j][x] = st[i / 3][j / 3][x] = false;
		a[i][j] = 0;
	}
	return false;
}
int main()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> a[i][j];
			int x = a[i][j];
			if (x)
			{
				// 标记⼀下 
				row[i][x] = col[j][x] = st[i / 3][j / 3][x] = true;
			}
		}
	}

	dfs(0, 0);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}